home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Games / Doom / ADoom-0.8 / ADoom_src / c2p_030.s < prev    next >
Text File  |  1998-06-24  |  11KB  |  452 lines

  1.         mc68020
  2.         multipass
  3.     if (_eval(DEBUG)&$8000)
  4.         debug    on,lattice4
  5.     endc
  6.  
  7. ; This routine based on Mikael Kalms' 030-optimised CPU3BLIT1
  8. ; Mikael Kalms' email address is kalms@vasa.gavle.se
  9. ;
  10. ; Simplified and changed to use Signal()s by Peter McGavin, 14 Jan 98
  11.  
  12.         xdef    _c2p1x1_cpu3blit1_queue_init
  13.         xdef    _c2p1x1_cpu3blit1_queue
  14.  
  15.         xref    _GfxBase
  16.  
  17. ;-----------------------------------------------------------------------
  18.         IFND    CHUNKYXMAX
  19. CHUNKYXMAX    equ    320
  20.         ENDC
  21.         IFND    CHUNKYYMAX
  22. CHUNKYYMAX    equ    200
  23.         ENDC
  24.  
  25. ;-----------------------------------------------------------------------
  26. ; d0.w  chunkyx [chunky-pixels]
  27. ; d1.w  chunkyy [chunky-pixels]
  28. ; d3.w  scroffsy [screen-pixels]
  29. ; d5.l  bplsize [bytes] -- offset between one row in one bpl and the next bpl
  30. ; d6.l  signals1 mask
  31. ; d7.l  signals3 mask
  32. ; a2.l  this task to Signal(signals1) on cleanup
  33. ; a3.l  other task to Signal(signals3) on cleanup
  34.  
  35. _c2p1x1_cpu3blit1_queue_init
  36.         movem.l    d2-d3,-(sp)
  37.         lea    (c2p_data,pc),a0
  38.         move.l    d6,(signals1-c2p_data,a0)
  39.         move.l    d7,(signals3-c2p_data,a0)
  40.         move.l    a2,(task-c2p_data,a0)
  41.         move.l    a3,(othertask-c2p_data,a0)
  42.         andi.l    #$ffff,d0
  43.         andi.l    #$ffff,d2
  44.         move.l    d5,(c2p_bplsize-c2p_data,a0)
  45.         move.w    d1,(c2p_chunkyy-c2p_data,a0)
  46.         add.w    d3,d1
  47.         mulu.w    d0,d1
  48.         lsr.l    #3,d1
  49.         subq.l    #2,d1
  50.         move.l    d1,(c2p_scroffs2-c2p_data,a0)
  51.         mulu.w    d0,d3
  52.         lsr.l    #3,d3
  53.         move.l    d3,(c2p_scroffs-c2p_data,a0)
  54.         move.w    (c2p_chunkyy-c2p_data,a0),d1
  55.         mulu.w    d0,d1
  56.         move.l    d1,(c2p_pixels-c2p_data,a0)
  57.         lsr.l    #4,d1
  58.         move.l    d1,(c2p_pixels16-c2p_data,a0)
  59.         movem.l    (sp)+,d2-d3
  60.         rts
  61.  
  62. ;-----------------------------------------------------------------------
  63. ; a0    c2pscreen
  64. ; a1    bitplanes
  65.  
  66. _c2p1x1_cpu3blit1_queue
  67.         movem.l    d2-d7/a2-a6,-(sp)
  68.  
  69.         lea    (c2p_data,pc),a2
  70.         move.l    a1,(c2p_screen-c2p_data,a2)
  71.  
  72.         move.l    #$0f0f0f0f,a4
  73.         move.l    #$00ff00ff,a5
  74.         move.l    #$55555555,a6
  75.  
  76.         lea    (c2p_blitbuf),a1
  77.         move.l    (c2p_pixels-c2p_data,a2),a2
  78.         add.l    a0,a2
  79.         cmpa.l    a0,a2
  80.         beq    .none
  81.  
  82.         move.l    (a0)+,d0
  83.         move.l    (a0)+,d6
  84.         move.l    (a0)+,a3
  85.         move.l    (a0)+,d7
  86.         move.l    a4,d5
  87.         move.l    d6,d1            ; Swap 4x1
  88.         lsr.l    #4,d1
  89.         eor.l    d0,d1
  90.         and.l    d5,d1
  91.         eor.l    d1,d0
  92.         lsl.l    #4,d1
  93.         eor.l    d6,d1
  94.  
  95.         move.l    a3,d6
  96.         move.l    d7,d4
  97.         lsr.l    #4,d4
  98.         eor.l    d6,d4
  99.         and.l    d5,d4
  100.         eor.l    d4,d6
  101.         lsl.l    #4,d4
  102.         eor.l    d4,d7
  103.  
  104.         move.l    a5,d5
  105.         move.l    d6,d2            ; Swap 8x2, part 1
  106.         lsr.l    #8,d2
  107.         eor.l    d0,d2
  108.         and.l    d5,d2
  109.         eor.l    d2,d0
  110.         lsl.l    #8,d2
  111.         eor.l    d6,d2
  112.  
  113.         bra.b    .start
  114. .x
  115.         move.l    (a0)+,d0
  116.         move.l    (a0)+,d6
  117.         move.l    (a0)+,a3
  118.         move.l    (a0)+,d7
  119.         move.l    d1,(a1)+
  120.         move.l    a4,d5
  121.         move.l    d6,d1            ; Swap 4x1
  122.         lsr.l    #4,d1
  123.         eor.l    d0,d1
  124.         and.l    d5,d1
  125.         eor.l    d1,d0
  126.         lsl.l    #4,d1
  127.         eor.l    d6,d1
  128.  
  129.         move.l    a3,d6
  130.         move.l    d7,d4
  131.         lsr.l    #4,d4
  132.         move.l    d2,(a1)+
  133.         eor.l    d6,d4
  134.         and.l    d5,d4
  135.         eor.l    d4,d6
  136.         lsl.l    #4,d4
  137.         eor.l    d4,d7
  138.  
  139.         move.l    a5,d5
  140.         move.l    d6,d2            ; Swap 8x2, part 1
  141.         lsr.l    #8,d2
  142.         eor.l    d0,d2
  143.         and.l    d5,d2
  144.         eor.l    d2,d0
  145.         move.l    d3,(a1)+
  146.         lsl.l    #8,d2
  147.         eor.l    d6,d2
  148. .start
  149.         move.l    a6,d4
  150.         move.l    d2,d3            ; Swap 1x2, part 1
  151.         lsr.l    #1,d3
  152.         eor.l    d0,d3
  153.         and.l    d4,d3
  154.         eor.l    d3,d0
  155.         add.l    d3,d3
  156.         eor.l    d3,d2
  157.  
  158.         move.l    d7,d3            ; Swap 8x2, part 2
  159.         lsr.l    #8,d3
  160.         move.l    d0,(a1)+
  161.         eor.l    d1,d3
  162.         and.l    d5,d3
  163.         eor.l    d3,d1
  164.         lsl.l    #8,d3
  165.         eor.l    d7,d3
  166.  
  167.         move.l    d3,d6            ; Swap 1x2, part 2
  168.         lsr.l    #1,d6
  169.         eor.l    d1,d6
  170.         and.l    d4,d6
  171.         eor.l    d6,d1
  172.         add.l    d6,d6
  173.         eor.l    d6,d3
  174.  
  175.         move.l    (a0)+,d0
  176.         move.l    (a0)+,d6
  177.         move.l    (a0)+,a3
  178.         move.l    (a0)+,d7
  179.         move.l    d1,(a1)+
  180.         move.l    a4,d5
  181.         move.l    d6,d1            ; Swap 4x1
  182.         lsr.l    #4,d1
  183.         eor.l    d0,d1
  184.         and.l    d5,d1
  185.         eor.l    d1,d0
  186.         lsl.l    #4,d1
  187.         eor.l    d6,d1
  188.  
  189.         move.l    a3,d6
  190.         move.l    d7,d4
  191.         lsr.l    #4,d4
  192.         move.l    d2,(a1)+
  193.         eor.l    d6,d4
  194.         and.l    d5,d4
  195.         eor.l    d4,d6
  196.         lsl.l    #4,d4
  197.         eor.l    d4,d7
  198.  
  199.         move.l    a5,d5
  200.         move.l    d6,d2            ; Swap 8x2, part 1
  201.         lsr.l    #8,d2
  202.         eor.l    d0,d2
  203.         and.l    d5,d2
  204.         eor.l    d2,d0
  205.         move.l    d3,(a1)+
  206.         lsl.l    #8,d2
  207.         eor.l    d6,d2
  208.  
  209.         move.l    a6,d4
  210.         move.l    d2,d3            ; Swap 1x2, part 1
  211.         lsr.l    #1,d3
  212.         eor.l    d0,d3
  213.         and.l    d4,d3
  214.         eor.l    d3,d0
  215.         add.l    d3,d3
  216.         eor.l    d3,d2
  217.  
  218.         move.l    d7,d3            ; Swap 8x2, part 2
  219.         lsr.l    #8,d3
  220.         move.l    d0,(a1)+
  221.         eor.l    d1,d3
  222.         and.l    d5,d3
  223.         eor.l    d3,d1
  224.         lsl.l    #8,d3
  225.         eor.l    d7,d3
  226.  
  227.         move.l    d3,d6            ; Swap 1x2, part 2
  228.         lsr.l    #1,d6
  229.         eor.l    d1,d6
  230.         and.l    d4,d6
  231.         eor.l    d6,d1
  232.         add.l    d6,d6
  233.         eor.l    d6,d3
  234.  
  235.         cmp.l    a0,a2
  236.         bne        .x
  237. .x2
  238.         move.l    d1,(a1)+
  239.         move.l    d2,(a1)+
  240.         move.l    d3,(a1)+
  241.  
  242.         lea    (c2p_bltnode,pc),a1
  243.         move.l    #c2p1x1_cpu3blit1_queue_41,(c2p_bltroutptr-c2p_bltnode,a1)
  244.         movea.l    (_GfxBase),a6
  245.         jsr    (_LVOQBlit,a6)
  246.  
  247. .none
  248.         movem.l (sp)+,d2-d7/a2-a6
  249.         rts
  250.  
  251. ;-----------------------------------------------------------------------
  252. c2p1x1_cpu3blit1_queue_41            ; Pass 4, subpass 1, ascending
  253.         move.w    #-1,(bltafwm,a0)
  254.         move.w    #-1,(bltalwm,a0)
  255.         move.l    #c2p_blitbuf,d0
  256.         add.l    #12,d0
  257.         move.l    d0,(bltapt,a0)
  258.         addq.l    #2,d0
  259.         move.l    d0,(bltbpt,a0)
  260.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  261.         add.l    d0,d0
  262.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  263.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  264.         move.l    d0,(bltdpt,a0)
  265.         move.w    #14,(bltamod,a0)
  266.         move.w    #14,(bltbmod,a0)
  267.         move.w    #0,(bltdmod,a0)
  268.         move.w    #$cccc,(bltcdat,a0)
  269.         move.w    #$0de4,(bltcon0,a0)
  270.         move.w    #$2000,(bltcon1,a0)
  271.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  272.         move.w    #1,(bltsizh,a0)
  273.         move.l    #c2p1x1_cpu3blit1_queue_42,(c2p_bltroutptr-c2p_bltnode,a1)
  274.         rts
  275.  
  276. ;-----------------------------------------------------------------------
  277. c2p1x1_cpu3blit1_queue_42            ; Pass 4, subpass 2, ascending
  278.         move.l    #c2p_blitbuf,d0
  279.         addq.l    #8,d0
  280.         move.l    d0,(bltapt,a0)
  281.         addq.l    #2,d0
  282.         move.l    d0,(bltbpt,a0)
  283.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  284.         add.l    d0,d0
  285.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  286.         add.l    d0,d0
  287.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  288.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  289.         move.l    d0,(bltdpt,a0)
  290.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  291.         move.w    #1,(bltsizh,a0)
  292.         move.l    #c2p1x1_cpu3blit1_queue_43,(c2p_bltroutptr-c2p_bltnode,a1)
  293.         rts
  294.  
  295. ;-----------------------------------------------------------------------
  296. c2p1x1_cpu3blit1_queue_43            ; Pass 4, subpass 3, ascending
  297.         move.l    #c2p_blitbuf,d0
  298.         addq.l    #4,d0
  299.         move.l    d0,(bltapt,a0)
  300.         addq.l    #2,d0
  301.         move.l    d0,(bltbpt,a0)
  302.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  303.         add.l    d0,d0
  304.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  305.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  306.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  307.         move.l    d0,(bltdpt,a0)
  308.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  309.         move.w    #1,(bltsizh,a0)
  310.         move.l    #c2p1x1_cpu3blit1_queue_44,(c2p_bltroutptr-c2p_bltnode,a1)
  311.         rts
  312.  
  313. ;-----------------------------------------------------------------------
  314. c2p1x1_cpu3blit1_queue_44            ; Pass 4, subpass 4, ascending
  315.         move.l    #c2p_blitbuf,d0
  316.         move.l    d0,(bltapt,a0)
  317.         addq.l    #2,d0
  318.         move.l    d0,(bltbpt,a0)
  319.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  320.         lsl.l    #3,d0
  321.         sub.l    (c2p_bplsize-c2p_bltnode,a1),d0
  322.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  323.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  324.         move.l    d0,(bltdpt,a0)
  325.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  326.         move.w    #1,(bltsizh,a0)
  327.         move.l    #c2p1x1_cpu3blit1_queue_45,(c2p_bltroutptr-c2p_bltnode,a1)
  328.         rts
  329.  
  330. ;-----------------------------------------------------------------------
  331. c2p1x1_cpu3blit1_queue_45            ; Pass 4, subpass 5, descending
  332.         move.l    #c2p_blitbuf,d0
  333.         subq.l    #4,d0
  334.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  335.         move.l    d0,(bltapt,a0)
  336.         addq.l    #2,d0
  337.         move.l    d0,(bltbpt,a0)
  338.         move.l    (c2p_screen-c2p_bltnode,a1),d0
  339.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  340.         move.l    d0,(bltdpt,a0)
  341.         move.w    #$2de4,bltcon0(a0)
  342.         move.w    #$0002,bltcon1(a0)
  343.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  344.         move.w    #1,(bltsizh,a0)
  345.         move.l    #c2p1x1_cpu3blit1_queue_46,(c2p_bltroutptr-c2p_bltnode,a1)
  346.         rts
  347.  
  348. ;-----------------------------------------------------------------------
  349. c2p1x1_cpu3blit1_queue_46            ; Pass 4, subpass 6, descending
  350.         move.l    #c2p_blitbuf,d0
  351.         subq.l    #8,d0
  352.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  353.         move.l    d0,(bltapt,a0)
  354.         addq.l    #2,d0
  355.         move.l    d0,(bltbpt,a0)
  356.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  357.         lsl.l    #2,d0
  358.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  359.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  360.         move.l    d0,(bltdpt,a0)
  361.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  362.         move.w    #1,(bltsizh,a0)
  363.         move.l    #c2p1x1_cpu3blit1_queue_47,(c2p_bltroutptr-c2p_bltnode,a1)
  364.         rts
  365.  
  366. ;-----------------------------------------------------------------------
  367. c2p1x1_cpu3blit1_queue_47            ; Pass 4, subpass 7, descending
  368.         move.l    #c2p_blitbuf,d0
  369.         sub.l    #12,d0
  370.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  371.         move.l    d0,(bltapt,a0)
  372.         addq.l    #2,d0
  373.         move.l    d0,(bltbpt,a0)
  374.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  375.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  376.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  377.         move.l    d0,(bltdpt,a0)
  378.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  379.         move.w    #1,(bltsizh,a0)
  380.         move.l    #c2p1x1_cpu3blit1_queue_48,(c2p_bltroutptr-c2p_bltnode,a1)
  381.         rts
  382.  
  383. ;-----------------------------------------------------------------------
  384. c2p1x1_cpu3blit1_queue_48            ; Pass 4, subpass 8, descending
  385.         move.l    #c2p_blitbuf,d0
  386.         sub.l    #16,d0
  387.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  388.         move.l    d0,(bltapt,a0)
  389.         addq.l    #2,d0
  390.         move.l    d0,(bltbpt,a0)
  391.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  392.         lsl.l    #2,d0
  393.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  394.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  395.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  396.         move.l    d0,(bltdpt,a0)
  397.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  398.         move.w    #1,(bltsizh,a0)
  399.         moveq    #0,d0
  400.         rts
  401.  
  402. ;-----------------------------------------------------------------------
  403. c2p_blitcleanup
  404.         movem.l    a2/a6,-(sp)
  405.         lea    (c2p_bltnode,pc),a2
  406.         move.l    (task-c2p_bltnode,a2),a1 ; signal QBlit() has finished
  407.         move.l    (signals1-c2p_bltnode,a2),d0
  408.         move.l    (4).w,a6
  409.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  410.         move.l    (othertask-c2p_bltnode,a2),a1
  411.         move.l    (signals3-c2p_bltnode,a2),d0
  412.         jsr    (_LVOSignal,a6)        ; signal pass 4 has finished
  413.         movem.l    (sp)+,a2/a6
  414.         rts
  415.  
  416. ;-----------------------------------------------------------------------
  417.         cnop 0,4
  418. c2p_bltnode
  419.         dc.l    0
  420. c2p_bltroutptr
  421.         dc.l    0
  422.         dc.b    $40,0
  423.         dc.l    0
  424. c2p_bltroutcleanup
  425.         dc.l     c2p_blitcleanup
  426.  
  427. task        dc.l    0    ; ptr to task to Signal(signals1) on cleanup()
  428. othertask    dc.l    0    ; ptr to task to Signal(signals3) on cleanup()
  429. signals1    dc.l    0    ; signals to Signal() this task at cleanup
  430. signals3    dc.l    0    ; signals to Signal() othertask at cleanup
  431.  
  432.         cnop    0,4
  433.  
  434. c2p_data
  435. c2p_screen    dc.l    0
  436. c2p_scroffs    dc.l    0
  437. c2p_scroffs2    dc.l    0
  438. c2p_bplsize    dc.l    0
  439. c2p_pixels    dc.l    0
  440. c2p_pixels16    dc.l    0
  441. c2p_chunkyy    dc.w    0
  442.  
  443. ;-----------------------------------------------------------------------
  444.         section bss_c,bss_c,chip
  445.  
  446. c2p_blitbuf
  447.         ds.b     CHUNKYXMAX*CHUNKYYMAX
  448.  
  449. ;-----------------------------------------------------------------------
  450.  
  451.         end
  452.